package com.luofan.common.util;

import com.luofan.common.result.CustomException;
import com.luofan.common.result.ResultCodeEnum;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component
public class JwtUtil {

    // 私密密钥，用于签名和验证 JWT（请确保这个密钥足够复杂且保密）
    @Value("${jwt_secret_key}")
    private String SECRET_KEY;

    //JWT自动过期时间(小时)
    @Value("${jwt_expiration_time}")
    private int EXPIRATION_TIME;

    // 生成 JWT 的方法，传入用户ID，职权标识，所属物业ID
    public String generateToken(Long userId, Byte role, Long sectionId) {
        // 生成并返回一个签名过的 JWT
        return Jwts.builder()
                // 设置 JWT 的用户ID 用户职权（Payload 部分）
                .claim("userId",userId)
                .claim("role",role)
                .claim("sectionId",sectionId)
                // 设置 JWT 的发行时间
                .setIssuedAt(new Date())
                // 设置 JWT 的过期时间
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * EXPIRATION_TIME))
                // 使用密钥和加密算法进行签名
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();  // 返回 JWT 字符串
    }

    // 从 JWT 中提取出用户 ID
    public Long extractUserId(String token) {
        // 解析 JWT，获取用户 ID（用户 ID 是作为 claim 存储在 Payload 中的）
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .get("userId", Long.class);  // 提取名为 "userId" 的 claim
    }

    // 从 JWT 中提取出用户role
    public Byte extractRole(String token) {
        // 解析 JWT，获取用户role（用户role 是作为 claim 存储在 Payload 中的）
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .get("role", Byte.class);  // 提取名为 "role" 的 claim
    }

    // 从 JWT 中提取出所属教研室ID
    public Long extractSectionId(String token) {
        // 解析 JWT，获取所属物业ID
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .get("sectionId", Long.class);  // 提取名为 "userId" 的 claim
    }

    // 判断 Token 是否过期
    public boolean isTokenExpired(String token) {
        try {
            // 解析 JWT 并检查其过期时间
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();

            // 获取 JWT 的过期时间
            Date expiration = claims.getExpiration();

            // 如果当前时间大于过期时间，表示 token 已经过期
            return expiration.before(new Date());
        } catch (ExpiredJwtException e) {
            // 如果发生 ExpiredJwtException 异常，说明 JWT 已过期，返回 true
            return true;
        } catch (Exception e) {
            throw new CustomException(ResultCodeEnum.SIGN_ERROR);
        }
    }

}
